#coding=utf-8

import pandas as pd
import re

# 代码说明：
# 格式检测：使用正则表达式^\d{4}-\d{2}$严格匹配"xxxx-xx"格式
#
# 示例有效值："2023-04"、"1999-12"
#
# 示例无效值："2023/04"、"23-01"、"2023-4"、"January-2023"
#
# 特殊处理：
#
# 自动跳过空值（NaN）
#
# 兼容数字/字符串类型的列
#
# 保留原始数据格式和顺序
#
# 输出：
#
# matched.xlsx：所有符合格式的行
#
# non_matched.xlsx：所有不符合格式的行
#
# 使用场景：
# 清洗时间序列数据
#
# 分离标准化日期和非标准化日期
#
# 验证用户输入格式
#
# 预处理需要日期计算的报表
#
# 注意事项：
# 确保指定的日期列名在Excel中存在
#
# 如果日期列包含混合格式（如"2023年04月"），这些行会被归类到non_matched.xlsx
#
# 大文件处理建议添加参数engine='openpyxl'（如pd.read_excel(..., engine='openpyxl')）
#
# 提示：如需调整日期格式（如要求月份必须01-12），可修改正则表达式为：r"^\d{4}-(0[1-9]|1[0-2])$"



def split_excel_by_date_format(input_file, output_file_match, output_file_non_match, date_column):
    # 读取Excel文件
    df = pd.read_excel(input_file)

    # 检查日期格式的函数（xxxx-xx）
    def check_date_format(date_str):
        if pd.isna(date_str):
            return False
        # 转换为字符串并匹配正则表达式
        return bool(re.match(r"^\d{4}-\d{2}$", str(date_str)))

    # 创建筛选条件
    mask = df[date_column].apply(check_date_format)

    # 拆分数据
    matched_df = df[mask].copy()  # 符合格式的数据
    non_matched_df = df[~mask].copy()  # 不符合格式的数据

    # 保存结果
    matched_df.to_excel(output_file_match, index=False)
    non_matched_df.to_excel(output_file_non_match, index=False)

    print(f"拆分完成！符合格式: {len(matched_df)}行, 不符合格式: {len(non_matched_df)}行")

if __name__ == '__main__':
    # 使用示例
    split_excel_by_date_format(
        input_file=r"E:\项目相关\13.可再生能源补贴\26.补贴项目功能扩展三期\13.数据对接\可再生数据 2\国网数据处理\python20250617\subsidy_OK1_全部补贴资金.xlsx",  # 输入文件名
        output_file_match=r"E:\项目相关\13.可再生能源补贴\26.补贴项目功能扩展三期\13.数据对接\可再生数据 2\国网数据处理\python20250617\matched.xlsx",  # 符合格式的输出文件
        output_file_non_match=r"E:\项目相关\13.可再生能源补贴\26.补贴项目功能扩展三期\13.数据对接\可再生数据 2\国网数据处理\python20250617\non_matched.xlsx",  # 不符合格式的输出文件
        date_column="PID_START_TM"  # 要检查的日期列名
    )